Guild icon
Project Sekai
🔒 GDG Algiers CTF 2022 / 🩸-misc-colorful-recipe
Avatar
Colorful Recipe - 500 points
Category: Misc Description: > Alice liked Bob's pancakes recipe so she asked him about it.
First remove the eggshell from the eggs. Add them to the flour. Now add the water. After cooking them add the sirup. After that put the secret_flavour, the flag and the previous mixture to the mixer (XOR). Can you help Alice find the flag to use it in the recipe???
Author : yh_0x7 Files:Tags: scripting
Sutx pinned a message to this channel. 10/08/2022 11:01 AM
Avatar
@crazyman ai wants to collaborate 🤝
Avatar
@sahuang wants to collaborate 🤝
12:19
@Guesslemonger wants to collaborate 🤝
Avatar
Guesslemonger 10/08/2022 12:19 PM
trying this
Avatar
looks guessy af
12:20
also they updated description
Avatar
Guesslemonger 10/08/2022 12:20 PM
values go above 255 fast
12:21
so rgb values obviously
12:22
eggs - eggshell + flour + water + sugar = cook (?) + sirup xor secret xor pancake = flag
12:22
from PIL import Image eggs = Image.open('eggs.jpg') eggshell = Image.open('eggshell.jpg') flour = Image.open('flour.jpg') water = Image.open('water.jpg') sugar = Image.open('sugar.jpg') syrup = Image.open('sirup.jpg') secret = Image.open('secret_flavour.jpg') pancake = Image.open('pancake.jpg') size = w,h = eggs.size final = Image.new(eggs.mode, eggs.size) deggs = eggs.load() dshell = eggshell.load() dflour = flour.load() dwater = water.load() dsugar = sugar.load() dsyrup = syrup.load() dsecret = secret.load() dpancake = pancake.load() dfinal = final.load() for x in range(w): for y in range(h): c = (0,0,0) c = list(c) c[0] = (deggs[x,y][0] - dshell[x,y][0] + dflour[x,y][0] + dwater[x,y][0] + dsugar[x,y][0] + dsyrup[x,y][0]) ^ dsecret[x,y][0] ^ dpancake[x,y][0] c[1] = (deggs[x,y][1] - dshell[x,y][1] + dflour[x,y][1] + dwater[x,y][1] + dsugar[x,y][1] + dsyrup[x,y][1]) ^ dsecret[x,y][1] ^ dpancake[x,y][1] c[2] = (deggs[x,y][2] - dshell[x,y][2] + dflour[x,y][2] + dwater[x,y][2] + dsugar[x,y][2] + dsyrup[x,y][2]) ^ dsecret[x,y][2] ^ dpancake[x,y][2] print(c) dfinal[x,y] = tuple(c) final.save('final.jpg')
12:22
this for now
12:23
all these additions go above 255
Avatar
Guesslemonger 10/08/2022 12:40 PM
apparently modulo 256 needs to be guessed
Avatar
@joezid wants to collaborate 🤝
Avatar
Guesslemonger 10/08/2022 1:02 PM
((((((((eggs - eggshell)%256)+flour)%256)+water)%256+sugar)%256+syrup)%256) xor secret xor flag)%256 = pancake no flag when doing reverse, so operations might be wrong
Avatar
c[0] = ((deggs[x,y][0] - dshell[x,y][0])&0xff) ^ dflour[x,y][0] ^ dwater[x,y][0] ^ dsugar[x,y][0] ^ dsyrup[x,y][0] ^ dsecret[x,y][0] ^ dpancake[x,y][0] c[1] = ((deggs[x,y][1] - dshell[x,y][1])&0xff) ^ dflour[x,y][1] ^ dwater[x,y][1] ^ dsugar[x,y][1] ^ dsyrup[x,y][1] ^ dsecret[x,y][1] ^ dpancake[x,y][1] c[2] = ((deggs[x,y][2] - dshell[x,y][2])&0xff) ^ dflour[x,y][2] ^ dwater[x,y][2] ^ dsugar[x,y][2] ^ dsyrup[x,y][2] ^ dsecret[x,y][2] ^ dpancake[x,y][2]
13:03
tried eggs - eggshell xored with rest
13:03
but still not a valid image
Avatar
Guesslemonger 10/08/2022 1:04 PM
umm only blend is xor i think
13:04
add is add
Avatar
maybe
Avatar
Guesslemonger 10/08/2022 1:10 PM
from PIL import Image eggs = Image.open('eggs.jpg') eggshell = Image.open('eggshell.jpg') flour = Image.open('flour.jpg') water = Image.open('water.jpg') sugar = Image.open('sugar.jpg') syrup = Image.open('sirup.jpg') secret = Image.open('secret_flavour.jpg') pancake = Image.open('pancake.jpg') size = w,h = eggs.size final = Image.new(eggs.mode, eggs.size) print(eggs.mode) deggs = eggs.load() dshell = eggshell.load() dflour = flour.load() dwater = water.load() dsugar = sugar.load() dsyrup = syrup.load() dsecret = secret.load() dpancake = pancake.load() dfinal = final.load() for x in range(w): for y in range(h): c = [0,0,0] c[0] = ((((((deggs[x,y][0] - dshell[x,y][0]) % 256) + dflour[x,y][0]) % 256 + dwater[x,y][0]) %256 + dsugar[x,y][0]) %256 + dsyrup[x,y][0]) %256 c[1] = ((((((deggs[x,y][1] - dshell[x,y][1]) % 256) + dflour[x,y][1]) % 256 + dwater[x,y][1]) %256 + dsugar[x,y][1]) %256 + dsyrup[x,y][1]) %256 c[2] = ((((((deggs[x,y][2] - dshell[x,y][2]) % 256) + dflour[x,y][2]) % 256 + dwater[x,y][2]) %256 + dsugar[x,y][2]) %256 + dsyrup[x,y][2]) %256 for i in range(0,256): if (c[0] ^ i ^ dsecret[x,y][0])%256 == dpancake[x,y][0]: c[0] = i if (c[1] ^ i ^ dsecret[x,y][1])%256 == dpancake[x,y][1]: c[1] = i if (c[2] ^ i ^ dsecret[x,y][2])%256 == dpancake[x,y][2]: c[2] = i dfinal[x,y] = tuple(c) print(dfinal[0,0]) final.save('final.jpg') (edited)
13:10
last thing i tried
13:10
no more ideas
Avatar
i will check it
13:21
is it reverse ?
Avatar
also admin are helpful in giving hintw
Avatar
ok i will try this now
Avatar
Asking admin now
14:18
I think I'm correct
Avatar
Avatar
Guesslemonger
from PIL import Image eggs = Image.open('eggs.jpg') eggshell = Image.open('eggshell.jpg') flour = Image.open('flour.jpg') water = Image.open('water.jpg') sugar = Image.open('sugar.jpg') syrup = Image.open('sirup.jpg') secret = Image.open('secret_flavour.jpg') pancake = Image.open('pancake.jpg') size = w,h = eggs.size final = Image.new(eggs.mode, eggs.size) print(eggs.mode) deggs = eggs.load() dshell = eggshell.load() dflour = flour.load() dwater = water.load() dsugar = sugar.load() dsyrup = syrup.load() dsecret = secret.load() dpancake = pancake.load() dfinal = final.load() for x in range(w): for y in range(h): c = [0,0,0] c[0] = ((((((deggs[x,y][0] - dshell[x,y][0]) % 256) + dflour[x,y][0]) % 256 + dwater[x,y][0]) %256 + dsugar[x,y][0]) %256 + dsyrup[x,y][0]) %256 c[1] = ((((((deggs[x,y][1] - dshell[x,y][1]) % 256) + dflour[x,y][1]) % 256 + dwater[x,y][1]) %256 + dsugar[x,y][1]) %256 + dsyrup[x,y][1]) %256 c[2] = ((((((deggs[x,y][2] - dshell[x,y][2]) % 256) + dflour[x,y][2]) % 256 + dwater[x,y][2]) %256 + dsugar[x,y][2]) %256 + dsyrup[x,y][2]) %256 for i in range(0,256): if (c[0] ^ i ^ dsecret[x,y][0])%256 == dpancake[x,y][0]: c[0] = i if (c[1] ^ i ^ dsecret[x,y][1])%256 == dpancake[x,y][1]: c[1] = i if (c[2] ^ i ^ dsecret[x,y][2])%256 == dpancake[x,y][2]: c[2] = i dfinal[x,y] = tuple(c) print(dfinal[0,0]) final.save('final.jpg') (edited)
Here no need to brute, just xor
14:19
for x in range(w): for y in range(h): c = [0,0,0] c[0] = deggs[x,y][0] - dshell[x,y][0] + dflour[x,y][0] + dwater[x,y][0] + dsugar[x,y][0] + dsyrup[x,y][0] c[1] = deggs[x,y][1] - dshell[x,y][1] + dflour[x,y][1] + dwater[x,y][1] + dsugar[x,y][1] + dsyrup[x,y][1] c[2] = deggs[x,y][2] - dshell[x,y][2] + dflour[x,y][2] + dwater[x,y][2] + dsugar[x,y][2] + dsyrup[x,y][2] c[0] = (c[0] ^ dsecret[x,y][0] ^ dpancake[x,y][0]) % 256 c[1] = (c[1] ^ dsecret[x,y][1] ^ dpancake[x,y][1]) % 256 c[2] = (c[2] ^ dsecret[x,y][2] ^ dpancake[x,y][2]) % 256 dfinal[x,y] = tuple(c)
Avatar
Pretty sure author is wrong in description or generation script, he is rechecking now
Avatar
Avatar
sahuang
used /ctf
🩸 Well done, you got first blood!
Avatar
from PIL import Image eggs = Image.open('eggs.jpg') eggshell = Image.open('eggshell.jpg') flour = Image.open('flour.jpg') water = Image.open('water.jpg') sugar = Image.open('sugar.jpg') syrup = Image.open('sirup.jpg') secret = Image.open('secret_flavour.jpg') pancake = Image.open('pancake.png') size = w,h = eggs.size final = Image.new(pancake.mode, pancake.size) print(eggs.mode) deggs = eggs.load() dshell = eggshell.load() dflour = flour.load() dwater = water.load() dsugar = sugar.load() dsyrup = syrup.load() dsecret = secret.load() dpancake = pancake.load() dfinal = final.load() for x in range(w): for y in range(h): c = [0,0,0] c[0] = (deggs[x,y][0] - dshell[x,y][0] + dflour[x,y][0] + dwater[x,y][0] + dsugar[x,y][0] + dsyrup[x,y][0]) % 128 c[1] = (deggs[x,y][1] - dshell[x,y][1] + dflour[x,y][1] + dwater[x,y][1] + dsugar[x,y][1] + dsyrup[x,y][1]) % 128 c[2] = (deggs[x,y][2] - dshell[x,y][2] + dflour[x,y][2] + dwater[x,y][2] + dsugar[x,y][2] + dsyrup[x,y][2]) % 128 c[0] = (c[0] ^ dsecret[x,y][0] ^ dpancake[x,y][0]) % 256 c[1] = (c[1] ^ dsecret[x,y][1] ^ dpancake[x,y][1]) % 256 c[2] = (c[2] ^ dsecret[x,y][2] ^ dpancake[x,y][2]) % 256 for i in range(3): if c[i] < 128: c[i] = 0 else: c[i] = 255 dfinal[x,y] = tuple(c) print(dfinal[0,0]) final.save('final.png') final2 = Image.new(pancake.mode, pancake.size) dfinal2 = final2.load() # iterate dfinal, each column find different color and mark as black for x in range(w): color = dfinal[x, 0] for y in range(h): if dfinal[x, y] != color: dfinal2[x, y] = (0, 0, 0) else: dfinal2[x, y] = (255, 255, 255) final2.save('final2.png')
Avatar
Guesslemonger 10/08/2022 8:54 PM
Nice, author had confirmed explicitly everything was mod 256. Looks like he too was super confused
Avatar
@Guesslemonger u have time later to try follow?
21:08
channel has some discussion, basically a race condition stuff
21:13
on script.sh
Avatar
Guesslemonger 10/08/2022 9:15 PM
Sure, will try in an hour or so
Exported 43 message(s)